while(1) 与for(;;) 的区别 您所在的位置:网站首页 for a while和in a while while(1) 与for(;;) 的区别

while(1) 与for(;;) 的区别

2024-01-19 21:25| 来源: 网络整理| 查看: 265

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:

编译前:

while (1);

编译后:

mov eax,1

test eax,eax

je foo+23h

jmp foo+18h

编译前:

for (;;);

编译后:

jmp foo+23h

显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。这是因为以前的编译器对这两种无线循环的编译处理不一致造成的。

三、 现代编译器(gcc-4.1.1-52-e15)对这两种无线循环的影响?

先看for.c

int main()

{

for(;;); return 0;

}

先看while.c

int main()

{

while(1); return 0;

}

用gcc编译

gcc –g –c for.c –o for.o gcc –g –c while.c –o while.o objdump –j .text –Sl while.o > while.txt objdump –j .text –Sl for.o > for.txt

结果从汇编来看,for(;;)和while(1)的汇编代码都是

4 : eb fe jmp 4

结论是:它们的汇编指令都是一样的,所以效率也是一样的

单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。

两者区别:

区别一

for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。

while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。

区别二

for.c源码:

include include


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有